package haut.system.member.person;

import haut.system.member.events.SportingEvents;
import haut.util.UtilOfSportsEvents;
import haut.util.exception.DataException;

import java.util.Vector;

/** 运动员类。
 * 师生报名参赛后即为运动员，
 * 一个工/学号只能对应一个该类的实例。
 *  @author MingJie Li
 *  */
final public class Player extends TeaAndStu {

    /**
     * <code>myEvents</code>类包含该运动员的参赛项目以及项目成绩。
     * */
    public class Events {

        /**
         * 参赛项目
         */
        SportingEvents events;

        /**
         * 该项目成绩
         */
        double score = 0.0;

        /**
         * 内部类<code>Events</code>的构造函数，
         * 参赛成绩在未经裁判评定之前默认为0。
         * @param events
         */
        public Events(SportingEvents events) {
            this.events = events;
            this.score = 0.0;
        }

        /**
         * 内部类Events的构造函数，
         * 在读取数据时使用
         * @param events
         * @param score
         */
        public Events(SportingEvents events, double score) {
            this.events = events;
            this.score = score;
        }


        /**
         * 获取参赛项目
         * @return {SportingEvents} events
         */
        public SportingEvents getEvents() {
            return events;
        }

        /**
         * 获取项目的比赛成绩
         * @return {double} score
         */
        public double getScore() {
            return score;
        }
    }

    public Vector<Events> myEvents = new Vector<Events>();

    /**
     * <code>Player</code>类的有参构造函数
     * @param teaAndStu 师生类
     * @param events 首个参赛项目
     * @throws DataException
     */
    public Player(TeaAndStu teaAndStu, SportingEvents events) throws DataException {
        super(teaAndStu.getId(), teaAndStu.getName());
        myEvents.add(new Events(events));
    }

    /**
     * 加入新项目
     * @param events
     */
    public void addEvent(SportingEvents events) {
        myEvents.add(new Events(events));
    }

    /**
     * 加入新项目,并赋成绩
     * @param events
     */
    public void addEvent(SportingEvents events, double score) {
        myEvents.add(new Events(events, score));
    }

    /**
     * 获取报名项目
     * @return {Vector} myEvents 项目集合
     */
    public Vector<Events> getMyEvents() {
        return myEvents;
    }

    /**
     * 查看报名项目
     */
    public void checkMyEvents() {
        Vector<Events> eventsVector = getMyEvents();
        System.out.println("你的报名项目有：");
        for(Events events : eventsVector)
            System.out.println(events.getEvents().getName());
    }

    /**
     * 获取自己在某个项目中的排名
     * @param id 项目编号
     * @return {int} rank 排名
     */
    public int getMyRankOfEvent(String id) {
        Vector<Events> eventsVector = getMyEvents();
        for(Events events : eventsVector) {
            if(events.getEvents().getId() == id) {
                Vector<Player> playerVector = UtilOfSportsEvents.ScoreSort(events.getEvents());
                int size = playerVector.size();
                for(int i = 0; i < size; ++i) {
                    if(playerVector.elementAt(i).getId() == getId())
                        return i + 1;
                }
            }
        }
        return 0;
    }

    /**
     * 查看自己在某个项目中的排名
     * @param id 项目编号
     */
    public void checkMyRankOfEvent(String id) {
        int rank = getMyRankOfEvent(id);
        String eventName = null;
        Vector<Events> eventsVector = getMyEvents();
        for(Events events : eventsVector) {
            if(events.getEvents().getId() == id) {
                eventName = events.getEvents().getName();
                break;
            }
        }
        System.out.println("你在项目 " + eventName + " 的排名为" + rank);
    }


    /**
     * 获取自己在某个项目的得分
     * @param id 项目编号
     * @return {double} score
     */
    public double getMyScoreOfEvent(String id) {
        Vector<Events> eventsVector = getMyEvents();
        for(Events event : eventsVector) {
            if(event.getEvents().getId() == id) {
                return event.getScore();
            }
        }
        return 0;
    }

    /**
     * 查看自己在某个项目的得分
     * @param id 项目编号
     */
    public void checkMyScoreOfEvent(String id) {
        double score = getMyScoreOfEvent(id);
        String eventName = null;
        Vector<Events> eventsVector = getMyEvents();
        for(Events events : eventsVector) {
            if(events.getEvents().getId() == id) {
                eventName = events.getEvents().getName();
                break;
            }
        }
        System.out.println("你在项目 " + eventName + " 的排名为" + score);
    }
}
